home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-01 | 6.8 KB | 290 lines | [TEXT/MMCC] |
- /*
- Copyright © 1993,1994 by Fabrizio Oddone
- ••• ••• ••• ••• ••• ••• ••• ••• ••• •••
- This source code is distributed as freeware: you can copy, exchange, modify this
- code as you wish. You may include this code in any kind of application: freeware,
- shareware, or commercial, provided that full credits are given.
- You may not sell or distribute this code for profit.
- */
-
- /* I did not write the code in this file; I took it from some sample code
- from Apple, I think.
- I modified the original code a little bit, though. */
-
- //#pragma load "MacDump"
-
- #include "StdGetFolder.h"
- #include "UtilsSys7.h"
-
- /* prototypes */
-
- static pascal short MyDlgHook(short item,DialogPtr theDlg,Ptr userData);
- static pascal Boolean MyModalFilter(DialogPtr theDlg,EventRecord *ev,short *itemHit,Ptr myData);
- static void HitButton(DialogPtr theDlg,short item);
- static pascal Boolean FilterAllFiles(CInfoPBPtr pb, Ptr myDataPtr);
- static void SetSelectButtonName(StringPtr selName,Boolean hilited,DialogPtr theDlg);
- static Boolean SameFile(FSSpec *file1,FSSpec *file2);
- static Boolean GetFSSpecPartialName(FSSpec *file,StringPtr fName);
- static OSErr GetDeskFolderSpec(FSSpec *fSpec,short vRefNum);
- static OSErr MakeCanonFSSpec(FSSpec *fSpec);
- static Boolean ShouldHiliteSelect(FSSpec *fSpec);
-
- /* typedefs */
-
- typedef struct {
- StandardFileReply *replyPtr;
- FSSpec oldSelection;
- } SFData, *SFDataPtr;
-
- /* constants */
-
- #define kSelectItem 10
- #define kSFDlg 128
- #define kCanSelectDesktop true
- #define kSelectStrRsrc 129
- #define kDeskStrRsrc 130
- #define kSelectKey 's'
-
- /* globals */
-
- Boolean gHasFindFolder;
- FSSpec gDeskFolderSpec;
-
- /*
- strHndl = GetString(kSelectStrRsrc);
- strHndl = GetString(kDeskStrRsrc);
- */
-
- /* do getfile */
-
- Boolean CustomGet(FSSpec *fSpec)
- {
- FileFilterYDUPP FilterAllFilesUPP = NewFileFilterYDProc(FilterAllFiles);
- DlgHookYDUPP MyDlgHookUPP = NewDlgHookYDProc(MyDlgHook);
- ModalFilterYDUPP MyModalFilterUPP = NewModalFilterYDProc(MyModalFilter);
- Point where = {-1,-1};
- StandardFileReply sfReply;
- SFData sfUserData;
- Boolean targetIsFolder, wasAliased;
-
- /* initialize user data area */
-
- sfUserData.replyPtr = &sfReply;
- sfUserData.oldSelection.vRefNum = -9999; /* init to ridiculous value */
-
- CustomGetFile(FilterAllFilesUPP, -1, nil, &sfReply, kSFDlg, where, MyDlgHookUPP,
- MyModalFilterUPP, nil, nil, &sfUserData);
-
- if (sfReply.sfGood) {
- if (ResolveAliasFile(&sfReply.sfFile, true, &targetIsFolder, &wasAliased))
- sfReply.sfGood = false;
- else if (FSMakeFSSpec(sfReply.sfFile.vRefNum, sfReply.sfFile.parID, sfReply.sfFile.name, fSpec))
- sfReply.sfGood = false;
- }
-
- if (MyModalFilterUPP)
- DisposeRoutineDescriptor(MyModalFilterUPP);
- if (MyDlgHookUPP)
- DisposeRoutineDescriptor(MyDlgHookUPP);
- if (FilterAllFilesUPP)
- DisposeRoutineDescriptor(FilterAllFilesUPP);
-
- return sfReply.sfGood;
- }
-
-
- /* this dialog hook checks the contents of the additional edit fields
- when the user selects a file. The focus of the dialog is changed if one
- of the fields is out of range.
- */
-
- pascal short MyDlgHook(short item,DialogPtr theDlg,Ptr userData)
- {
- SFDataPtr sfUserData;
- FSSpec curSpec;
- OSType refCon;
-
- refCon = GetWRefCon(theDlg);
- if (refCon != sfMainDialogRefCon)
- return item;
-
- sfUserData = (SFDataPtr) userData;
-
- if (item==sfHookFirstCall || item==sfHookLastCall)
- return item;
-
- if (item==sfItemVolumeUser) {
- sfUserData->replyPtr->sfFile.name[0] = '\0';
- sfUserData->replyPtr->sfFile.parID = 2;
- sfUserData->replyPtr->sfIsFolder = false;
- sfUserData->replyPtr->sfIsVolume = false;
- sfUserData->replyPtr->sfFlags = 0;
- item = sfHookChangeSelection;
- }
-
- if (!SameFile(&sfUserData->replyPtr->sfFile,&sfUserData->oldSelection)) {
- curSpec = sfUserData->replyPtr->sfFile;
- MakeCanonFSSpec(&curSpec);
-
- if (curSpec.vRefNum != sfUserData->oldSelection.vRefNum)
- GetDeskFolderSpec(&gDeskFolderSpec,curSpec.vRefNum);
- SetSelectButtonName(curSpec.name,ShouldHiliteSelect(&curSpec),theDlg);
-
- sfUserData->oldSelection = sfUserData->replyPtr->sfFile;
- }
-
- if (item == kSelectItem)
- item = sfItemOpenButton;
-
- return item;
- }
-
-
- pascal Boolean MyModalFilter(DialogPtr theDlg,EventRecord *ev,short *itemHit,Ptr /*myData*/)
- {
- Boolean evHandled;
- char keyPressed;
- OSType refCon;
-
- refCon = GetWRefCon(theDlg);
- if (refCon != sfMainDialogRefCon)
- return false;
-
- evHandled = false;
-
- switch (ev->what) {
- case keyDown:
- case autoKey:
- keyPressed = CHARFROMMESSAGE(ev->message);
- if ((ev->modifiers & cmdKey) != 0) {
- switch (keyPressed) {
- case kSelectKey:
- HitButton(theDlg,kSelectItem);
- *itemHit = kSelectItem;
- evHandled = true;
- break;
- }
- }
- break;
- }
-
- return evHandled;
- }
-
-
- void HitButton(DialogPtr theDlg, short item)
- {
- Rect iRect;
- ControlHandle iHndl;
- long fTicks;
- short iType;
-
- GetDItem(theDlg, item, &iType, (Handle *)&iHndl, &iRect);
- HiliteControl(iHndl,inButton);
- Delay(5L, &fTicks);
- HiliteControl(iHndl,0);
- }
-
-
- pascal Boolean FilterAllFiles(CInfoPBPtr pb, Ptr /*myDataPtr*/)
- {/* file is a directory */
- return ((pb->hFileInfo.ioFlAttrib & (1<<4)) == 0);
- }
-
-
- void SetSelectButtonName(StringPtr selName,Boolean hilited,DialogPtr theDlg)
- {
- Str255 storeName, tempLenStr, tempSelName;
- Rect iRect;
- StringHandle theString;
- Handle iHndl;
- short iType;
- short btnWidth;
-
- (void) PLstrcpy(tempSelName, selName);
- GetDItem(theDlg,kSelectItem,&iType,&iHndl,&iRect);
-
- /* truncate select name to fit in button */
-
- btnWidth = iRect.right - iRect.left;
- theString = GetString(kSelectStrRsrc);
-
- (void) PLstrcpy(tempLenStr, *theString);
-
- PLstrcat((StringPtr)tempLenStr,"\p “” ");
- btnWidth -= StringWidth(tempLenStr);
- TruncString(btnWidth,tempSelName,smTruncMiddle);
-
- (void) PLstrcpy(storeName, *theString);
- PLstrcat((StringPtr)storeName,"\p “");
- PLstrcat((StringPtr)storeName,(StringPtr)tempSelName);
- PLstrcat((StringPtr)storeName,"\p”");
-
- SetCTitle((ControlHandle)iHndl,storeName);
-
- SetDItem(theDlg,kSelectItem,iType,iHndl,&iRect);
-
- HiliteControl((ControlHandle)iHndl, hilited ? 0 : 255);
- }
-
-
- Boolean SameFile(FSSpec *file1,FSSpec *file2)
- {
- return ((file1->vRefNum == file2->vRefNum) &&
- (file1->parID == file2->parID) &&
- (EqualString(file1->name,file2->name,false,true)));
- }
-
-
- OSErr GetDeskFolderSpec(FSSpec *fSpec,short vRefNum)
- {
- register OSErr err;
-
- if (gHasFindFolder == false) {
- fSpec->vRefNum = -9999;
- return -1;
- }
-
- fSpec->name[0] = '\0';
- err = FindFolder(vRefNum,kDesktopFolderType,kDontCreateFolder,
- &fSpec->vRefNum,&fSpec->parID);
- if (err == noErr)
- err = MakeCanonFSSpec(fSpec);
-
- return err;
- }
-
-
- Boolean ShouldHiliteSelect(FSSpec *fSpec)
- {
- StringHandle strHndl;
-
- if (SameFile(fSpec,&gDeskFolderSpec)) {
- strHndl = GetString(kDeskStrRsrc);
- (void) PLstrcpy(fSpec->name, *strHndl);
- return kCanSelectDesktop;
- }
- else
- return true;
- }
-
-
- OSErr MakeCanonFSSpec(FSSpec *fSpec)
- {
- DirInfo infoPB;
- OSErr err;
-
- if (fSpec->name[0] != '\0')
- return noErr; /* controllare */
-
- infoPB.ioNamePtr = fSpec->name;
- infoPB.ioVRefNum = fSpec->vRefNum;
- infoPB.ioDrDirID = fSpec->parID;
- infoPB.ioFDirIndex = -1;
- err = PBGetCatInfo((CInfoPBPtr)&infoPB,false);
- fSpec->parID = infoPB.ioDrParID;
-
- return err;
- }
-
-